package cliente;

import Obrero.Obrero;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Cliente implements Runnable{
	
    private Thread hiloc = new Thread(this);
    private String host;
    private Integer port;
    private Socket sc;
    private Obrero p;
    private boolean buclerecibir=true;
    private Obrero servidorsalir;
    private boolean bucleconectar;
    private boolean conectado;

    public Cliente(String host, Integer port) throws UnknownHostException, IOException{
        this.host = host;
        this.port = port;
        
        p = null;

        servidorsalir = new Obrero("FINCONEXION");
        hiloc.start();
    }


    @Override
    public void run() {
        conectado = false;
        bucleconectar = true;
        while(bucleconectar){
            try {
                sc = new Socket(host, port);
                conectado = true;
                bucleconectar = false;
                System.out.println("Cliente: Conectado a IP: " + host + "    Puerto: " + port);
            } catch(java.net.ConnectException ex){
                System.out.println("Cliente: Reintentando conectar en 1 segundo.");
            } catch (UnknownHostException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        while(buclerecibir&&conectado) //EL CLIENTE SE QUEDA ESCUCHANDO MENSAJES SIEMPRE
        {
            try
            {
                recibir_dato();
            }
            catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            }
        }
        System.out.println("Conexión finalizada, se termina el hilo del cliente.");
        //salir();
    }

    public void recibir_dato()//recibir un objeto en el cliente
    {

            try {
                ObjectInputStream ois;
                try {
                        ois = new ObjectInputStream(sc.getInputStream());
                } catch(IOException ex ){
                        buclerecibir = false;
                        return;
                }

                //SocketException sex = new SocketException("Connection reset");

                try {
                p =(Obrero) ois.readObject();
                if (p!=null)
                {

                    //ACA SE DEBEN LLAMAR LOS METODOS QUE INICIEN LOS OBREROS PARA LA CIUDAD
                    System.out.println("recibi un obrero en el cliente: ");
                            System.out.println("obrero_cliente: " +p.getname());
                            System.out.println("estado_cliente: " +p.getEstado());

                            p=null; // se borra provisoriamente para recibir nuevos obreros
                }

                } catch (ClassNotFoundException ex) 

                {
                    Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    System.out.println("Error clase ");}

        // ois.close();
        // sc.close();

        } catch (UnknownHostException ex) {
            System.out.println("Error Host ");
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            System.out.println("Error IO ");
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);

            } catch (Exception ex) {
                System.out.println("Error General ");
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }

    }

    public void enviar_dato(Obrero objeto)  throws  IOException {
            try {
            ObjectOutputStream oos;
            try {
                    oos = new ObjectOutputStream(sc.getOutputStream());
            }catch(IOException ex ){
                    javax.swing.JOptionPane.showMessageDialog(null, "Se perdió la conexión.");
                    System.exit(0);
                    return;
            }

            oos.writeObject(objeto);
            oos.flush();

            System.out.println("se envio un obrero desde el cliente: ");
                    System.out.println("Obrero_cliente: " + objeto.getname());
                    System.out.println("Estado_cliente: " + objeto.getEstado());
            //oos.close();
        } catch (UnknownHostException ex) {
            Logger.getLogger(cliente.Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }


    public void salir() //se cierran los sockets SOLO INVOCAR AL FINALIZAR EL PROGRAMA!!!
    {

            try{ 
                    System.out.println("Conexion finalizada");
                    sc.close();
            }
            catch(IOException e)
                    {
                    System.out.println("Error salir: "+e.getMessage());
                    System.exit(0);
                    }		
    }

    public void terminarrun()
    {
        buclerecibir=false;
        try {
                enviar_dato(servidorsalir); //enviar salir al servidor
            } catch (IOException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    
    public void cancelar(){
        bucleconectar = false;
    }
}